package org.opens.web.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;

/**
 * 说明:
 *      这个配置类定义了如何请求静态资源.
 * 注意:
 *      1. 如果开启了这个bean的注册, 在页面上需要以绝对路径方式请求静态资源;
 *      ```
 *      <script src="/static/jquery-3.4.1.js"></script>
 *      ```
 *      2. 如果不开启这个bean的注册, 则可以在任意页面上可以使用下面的这种方式请求:
 *          - 这种方式更加灵活, 但是也写的更多.
 *      ```
 *      <script src="../jquery-3.4.1.js"></script>
 *      ```
 *          - 但是这种方式好像有一个问题就是, 页面跳转的请求层数需要固定, 例如:
 *          ```
 *          设置a页面的请求为: /page/a;
 *          则从a页面跳转到b页面的请求必须为/page/b, 如果为/page/demo/b会导致静态资源找不到, 会自动在url前面加上/page, 最终的请求为: /page/page/demo/b
 *          ```
 */
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {


    /**
     * addResourceHandlers
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // 当前项目的静态资源访问问题
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");

        // 解决swagger页面无法访问
        registry.addResourceHandler("/swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");

        // 解决swagger的js, css文件无法访问
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {

    }

    /**
     * 功能:
     *      浏览器发起跨域请求时, 会报错, 这个配置是为了使spring boot支持跨域请求.
     * 说明:
     *      1. 浏览器报错内容:
     *      ```
     *      AjaxDemo1.html?_ijt=dstl2ll3jfmse4agegvs4bj5vj:1 Access to XMLHttpRequest at 'http://localhost/json/order' from origin 'http://localhost:63342' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
     *      ```
     *      2. 跨域请求报错的场景:
     *          - 使用本地html文件发起ajax请求其他启动的服务的api.
     *
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                //放行哪些原始域
                .allowedOrigins("*")
                //是否发送Cookie信息
                .allowCredentials(true)
                //放行哪些原始域(请求方式)
                .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")
                .maxAge(3600)
                //放行哪些原始域(头部信息)
                .allowedHeaders("*");
    }

}
